package io.renren.modules.vipuser.controller;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import io.renren.common.annotation.SysLog;
import io.renren.common.utils.ConstantUtils;
import io.renren.common.validator.ValidatorUtils;
import io.renren.common.validator.group.AddGroup;
import io.renren.common.validator.group.UpdateGroup;
import io.renren.modules.dictionary.entity.DictionaryEntity;
import io.renren.modules.dictionary.service.DictionaryService;
import io.renren.modules.dictionary.service.DictypesService;
import io.renren.modules.sys.controller.AbstractController;
import io.renren.modules.user.entity.UserinfosEntity;
import io.renren.modules.user.service.UserinfosService;
import io.renren.modules.user.util.UserUtil;
import io.renren.modules.vipuser.entity.VipinfoCustomEntity;
import io.renren.modules.vipuser.util.VipUserUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


import io.renren.modules.vipuser.service.VipinfosService;
import io.renren.common.utils.PageUtils;
import io.renren.common.utils.Query;
import io.renren.common.utils.R;




/**
 * 
 *
 * @author
 * @email
 * @date 2018-10-24 20:20:23
 */
@RestController
@RequestMapping("/vipuser/vipinfos")
public class VipinfosController extends AbstractController {
	@Autowired
	private VipinfosService vipinfosService;
	@Autowired
	private DictionaryService dictionaryService;
	@Autowired
	private UserinfosService userinfosService;

	//没通过，且没通过原因
	private final int CANNOTPASSEMPTY = 100;
	//通过，但有值
	private final int PASS = 200;
	//错误
	private final int ERROR = 300;

	/**
	 * 列表
	 */
	@SysLog("获取会员列表")
	@RequestMapping("/list")
	@RequiresPermissions("vipuser:vipinfos:list")
	public R list(@RequestParam Map<String, Object> params) {
		//查询列表数据
		Query query = new Query(params);

		List<VipinfoCustomEntity> vipinfosList = vipinfosService.queryList(query);
		int total = vipinfosService.queryTotal(query);

		PageUtils pageUtil = new PageUtils(vipinfosList, total, query.getLimit(), query.getPage());

		return R.ok().put("page", pageUtil);
	}


	/**
	 * 信息
	 */
	@SysLog("获取会员信息")
	@RequestMapping("/info/{vipinfoid}")
	@RequiresPermissions("vipuser:vipinfos:info")
	public R info(@PathVariable("vipinfoid") Integer vipinfoid) {
		VipinfoCustomEntity vipinfos = vipinfosService.queryObject(vipinfoid);

		return R.ok().put("vipinfos", vipinfos);
	}

	/**
	 * 保存
	 */
	@SysLog("新增会员信息")
	@RequestMapping("/save")
	@RequiresPermissions("vipuser:vipinfos:save")
	public R save(@RequestBody VipinfoCustomEntity vipinfos) {
		ValidatorUtils.validateEntity(vipinfos, AddGroup.class);
		//用户ID必须存在在用户表中
		int userIdExist = userinfosService.isUserIdExist(vipinfos.getUserinfoid());
		if (userIdExist == 0){
			return R.error("当前所属用户不存在");
		}
		if (vipinfos.getPriceinvip().compareTo(new BigDecimal(0)) < 0){
			return R.error("价格不为负数");
		}
		R judgeIsDelError = vipinfosService.judgeIsDelError(vipinfos.getIsdel());
		if (judgeIsDelError != null){
			return judgeIsDelError;
		}
		//一个用户不能为多个会员
		int vipCount = vipinfosService.isVipUserRepetition(vipinfos.getUserinfoid());
		if (vipCount > 0) {
			return R.error("此用户已在会员列表中");
		}
		Date now = new Date();
		/*//补充发布信息和浏览信息
		//字典原始信息
		List<DictionaryEntity> generalUserFieldManagement = dictionaryService.searchByTypename("VipUserFieldManagement");
		//原始信息处理
		Map<String, Object> informationProcessing = VipUserUtil.vipUserFieldDictionaryInformationProcessing(generalUserFieldManagement);
		//发布次数填充
		vipinfos.setPostmessagetimes((Integer) informationProcessing.get("VipAverageUserPostingTimes"));
		//浏览次数填充
		vipinfos.setVipbrowsemessagetimes((Integer) informationProcessing.get("VipNumberOfVisitsByOrdinaryUsers"));*/
		//产生创建时间
		vipinfos.setCreatetime(now);
		//产生更新时间
		vipinfos.setUpdatetime(now);
		//产生审核状态时间
		vipinfos.setAuditdate(now);
		//判断不通过理由和审核通过的要求
		int state = isCannotPassReason(vipinfos);
		if (CANNOTPASSEMPTY == state){
			//审核不通过，且没有不通过原因
			return R.error(500,"请输入不通过理由哦！");
		}else if (ERROR == state){
			//错误
			return R.error();
		}
		vipinfosService.save(vipinfos);
		return R.ok();
	}

	/**
	 * 修改
	 */
	@SysLog("修改会员信息")
	@RequestMapping("/update")
	@RequiresPermissions("vipuser:vipinfos:update")
	public R update(@RequestBody VipinfoCustomEntity vipinfos) {
		if (vipinfos.getPriceinvip().compareTo(new BigDecimal(0)) < 0){
			return R.error("价格不为负数");
		}
		R judgeIsDelError = vipinfosService.judgeIsDelError(vipinfos.getIsdel());
		if (judgeIsDelError != null){
			return judgeIsDelError;
		}
		//获取数据库中原数据
		VipinfoCustomEntity vipinfoCustomEntity = vipinfosService.queryObject(vipinfos.getVipinfoid());
		//用户ID不可修改
		if (!vipinfoCustomEntity.getUserinfoid().equals(vipinfos.getUserinfoid())){
			return R.error("所属用户不可修改");
		}
		//填充用户更新时间
		vipinfos.setUpdatetime(new Date());
		//用户审核状态发生变化，修改审核状态时间和用户Vip状态
		if (!vipinfos.getAuditstatus().equals(vipinfoCustomEntity.getAuditstatus())) {
			vipinfos.setAuditdate(new Date());
		}
		//判断不通过理由和审核通过的要求
		int state = isCannotPassReason(vipinfos);
		if (CANNOTPASSEMPTY == state){
			//审核不通过，且没有不通过原因
			return R.error(500,"请输入不通过理由哦！");
		}else if(ERROR == state){
			//错误
			return R.error();
		}

		//软删除的vip为普通用户
		if (vipinfos.getIsdel().equals(ConstantUtils.DELED)){
			updateUserVipStatus(vipinfos.getUserinfoid(), ConstantUtils.COMMON);
		}

		vipinfosService.update(vipinfos);

		return R.ok();
	}

	/**
	 * 删除
	 */
	@SysLog("删除会员信息")
	@RequestMapping("/delete")
	@RequiresPermissions("vipuser:vipinfos:delete")
	public R delete(@RequestBody Integer[] vipinfoids) {
		//删除之前，修改用户Vip状态
		if (vipinfoids != null){
			UserinfosEntity userinfosEntity;
			for (int i = 0; i < vipinfoids.length; i++) {
				VipinfoCustomEntity customEntity = vipinfosService.queryObject(vipinfoids[i]);
				userinfosEntity = new UserinfosEntity();
				userinfosEntity.setUserinfoid(customEntity.getUserinfoid());
				userinfosEntity.setIsvip(ConstantUtils.COMMON);
				userinfosEntity.setUpdatetime(new Date());
				userinfosService.update(userinfosEntity);
			}
			vipinfosService.deleteBatch(vipinfoids);
			return R.ok();
		}
		return R.error("未选择用户");
	}


	/**
	 * 修改
	 */
	@SysLog("修改会员审核信息")
	@RequestMapping("/vipauditUpdate")
	@RequiresPermissions("vipaudit:vipinfos:update")
	public R vipauditUpdate(@RequestBody VipinfoCustomEntity vipinfos) {
		//获取数据库中原数据
		VipinfoCustomEntity vipinfoCustomEntity = vipinfosService.queryObject(vipinfos.getVipinfoid());
		//用户ID不可修改
		if (!vipinfoCustomEntity.getUserinfoid().equals(vipinfos.getUserinfoid())){
			return R.error("所属用户不可修改");
		}

		if (vipinfoCustomEntity.getExpirationtime().getTime() != vipinfos.getExpirationtime().getTime()){
			return R.error("会员到期时间不可更改");
		}

		if (vipinfoCustomEntity.getPriceinvip().compareTo(vipinfos.getPriceinvip()) != 0){
			return R.error("会员申请价格不可更改");
		}
		//填充用户更新时间
		vipinfos.setUpdatetime(new Date());
		//用户审核状态发生变化，修改审核状态时间和用户Vip状态
		if (!vipinfos.getAuditstatus().equals(vipinfoCustomEntity.getAuditstatus())) {
			vipinfos.setAuditdate(new Date());
		}
		//判断不通过理由和审核通过的要求
		int state = isCannotPassReason(vipinfos);
		if (CANNOTPASSEMPTY == state){
			//审核不通过，且没有不通过原因
			return R.error(500,"请输入不通过理由哦！");
		}else if(ERROR == state){
			//错误
			return R.error();
		}

		//软删除的vip为普通用户
		if (vipinfos.getIsdel().equals(ConstantUtils.DELED)){
			updateUserVipStatus(vipinfos.getUserinfoid(), ConstantUtils.COMMON);
		}

		vipinfosService.update(vipinfos);

		return R.ok();
	}

	/*
	* 修改用户Vip状态
	* */
	private void updateUserVipStatus(String userinfoid, int status) {
		UserinfosEntity userinfosEntity = new UserinfosEntity();
		userinfosEntity.setUserinfoid(userinfoid);
		userinfosEntity.setIsvip(status);
		userinfosEntity.setUpdatetime(new Date());
		userinfosService.update(userinfosEntity);
	}

	/**
	 * 检查用户的审核状态和不通过原因
	 * @param vipinfos
	 * @return
	 */
	private int isCannotPassReason(VipinfoCustomEntity vipinfos) {
		// 0：待审核，为默认值，
		// 1：审核通过
		// 2：审核失败
		//获取不通过原因
		String cannotpassreason = vipinfos.getCannotpassreason();
		//管理者员通过会员，需要添加不通过原因，并设置审核时间
		//设置更新日期时间
		vipinfos.setUpdatetime(new Date());
		//获取审核状态
		Integer auditstatus = vipinfos.getAuditstatus();
		//0：待审核：清空审核通过时间，清空传递对象的审核人，审核时间，不通过原因（这并没有清空数据库中的，若数据库中还有代表是上次不通过的时间，审核人，不通过理由）
		//1：审核成功：添加审核人，审核时间，清空数据空中的不通过原因，
		//2：审核失败（需要：不通过原因）：添加审核人，审核时间，不通过原因
		if (ConstantUtils.AUDITFAILURE == auditstatus) {
			//审核失败
			//原因不能为空
			if (cannotpassreason == null || "".equals(cannotpassreason.trim())) {
				//为空，返回数据叫管理员输入理由
				return CANNOTPASSEMPTY;
			}
				//原因不为空
				//添加审核人，审核时间，不通过原因
				//设置处理人id
				vipinfos.setDealuser(getUserId());
				//待审核，修改用户Vip状态
				updateUserVipStatus(vipinfos.getUserinfoid(), ConstantUtils.COMMON);
				return PASS;
		} else if (ConstantUtils.AUDITED == auditstatus) {
			//通过
			//添加审核人，审核时间，清空数据空中的不通过原因，
			//清空数据库中的不通过原因
			vipinfos.setDealuser(getUserId());
			updateUserVipStatus(vipinfos.getUserinfoid(),ConstantUtils.VIP);
			vipinfos.setCannotpassreason("");
			//通过却填写了不通过的理由
			//需要清空理由来保存
			return PASS;
		} else if (ConstantUtils.AUDIT == auditstatus) {
			//待审核
			//清空审核通过时间，清空传递对象的审核人，不通过原因（这并没有清空数据库中的，若数据库中还有代表是上次不通过的时间，审核人，不通过理由）
			vipinfos.setDealuser(null);
			vipinfos.setCannotpassreason(null);
			//待审核，修改用户Vip状态
			updateUserVipStatus(vipinfos.getUserinfoid(),ConstantUtils.COMMON);
			return PASS;
		} else {
			//出问题
			return ERROR;
		}
	}
}

